#ifndef UTIL_H
#define UTIL_H

#include <stdint.h>
#ifdef __cplusplus
extern "C" {
#endif

/* 在此处添加函数声明和宏定义 */
/**
 * @brief crc16校验
 *
 * @param data 发送数组的指针
 * @param length 需要计算的长度
 * @return uint16_t
 */
uint16_t modbus_crc16(uint8_t* data, uint8_t length);

void float_logic_to_modbus(float input, uint16_t* modbus_array, int index);
void float_modbus_to_logic(uint16_t* modbus_array, float* output, int index);
void double_logic_to_modbus(double input, uint16_t* modbus_array, int index);
void double_modbus_to_logic(uint16_t* modbus_array, double* output, int index);
void uint32_logic_to_modbus(uint32_t input, uint16_t* modbus_array, int index);
void uint32_modbus_to_logic(const uint16_t* modbus_array, uint32_t* output, int index);
void int32_logic_to_modbus(int32_t input, uint16_t* modbus_array, int index);
void int32_modbus_to_logic(const uint16_t* modbus_array, int32_t* output, int index);
void uint64_logic_to_modbus(uint64_t input, uint16_t* modbus_array, int index);
void uint64_modbus_to_logic(const uint16_t* modbus_array, uint64_t* output, int index);
void int64_logic_to_modbus(int64_t input, uint16_t* modbus_array, int index);
void int64_modbus_to_logic(const uint16_t* modbus_array, int64_t* output, int index);

// 大转小4字节
void modbus_to_logic_4B(const uint16_t* modbus_array, uint16_t* logic_array, int index);
// 小转大4字节
void logic_to_modbus_4B(const uint16_t* logic_array, uint16_t* modbus_array, int index);
// 大转小8字节
void modbus_to_logic_8B(const uint16_t* modbus_array, uint16_t* logic_array, int index);
// 小转大8字节
void logic_to_modbus_8B(const uint16_t* logic_array, uint16_t* modbus_array, int index);

#define STATIC_ASSERT(cond, msg) typedef char static_assert_##msg[(cond) ? 1 : -1]

/**
 * @brief 根据地址返回AI数组中的下标
 *
 */
#define GET_START_ADDR(xmz_addr)                                                                                       \
  ((xmz_addr % 2 != 0) ? 0 : ((xmz_addr > (DIQM_NUM_LEN - 1)) ? ((xmz_addr - DIQM_NUM_LEN) / 2) : 0))
#ifdef __cplusplus
}
#endif

#endif /* UTIL_H */
